import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:todo/controllers/task_controller.dart';
import 'package:todo/models/task_model.dart';

class AddTaskScreen extends StatefulWidget {
  final Task? task; // 可选参数，用于编辑任务
  final int? index; // 可选参数，用于编辑任务的索引
  const AddTaskScreen({super.key, this.task, this.index});

  @override
  State<AddTaskScreen> createState() => _AddTaskScreenState();
}

class _AddTaskScreenState extends State<AddTaskScreen>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  // Get.find() 是 GetX 框架中的一个方法，用于获取一个控制器的实例，需要传入一个控制器的类型，例如：`Get.find<TaskController>()`
  final TaskController taskController = Get.find(); // 获取 TaskController 实例
  final TextEditingController titleController =
      TextEditingController(); // 标题控制器，用于获取标题输入框的值
  final TextEditingController descriptionController =
      TextEditingController(); // 描述控制器，用于获取描述输入框的值

  DateTime? selectedDate; // 选中的日期，用于获取日期选择器的值

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this);
    if (widget.task != null) {
      // 如果是编辑任务，则设置标题和描述控制器的值
      titleController.text =
          widget.task!.title; // 设置标题控制器的值为任务的标题,! 表示非空断言，用于确保 widget.task 不为空
      descriptionController.text = widget.task!.description; // 设置描述控制器的值为任务的描述
      selectedDate = widget.task!.dueDate; // 设置选中的日期为任务的截止日期
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Colors.deepPurple,
        title: Text(
          widget.task == null
              ? 'Add New Task'
              : 'Edit Task', // 如果是添加任务，则显示 'Add Task'，否则显示 'Edit Task'
          style: TextStyle(fontWeight: FontWeight.bold), // 设置标题的字体为粗体
        ),
      ),
      body: Padding(
        padding: EdgeInsets.all(20),
        child: Column(
          crossAxisAlignment:
              CrossAxisAlignment
                  .start, // 定义子元素的对齐方式，例如：左对齐，右对齐，居中对齐等;CrossAxisAlignment.start 表示左对齐，CrossAxisAlignment.end 表示右对齐，CrossAxisAlignment.center 表示居中对齐
          children: [
            Text(
              'Task Title',
              style: TextStyle(fontWeight: FontWeight.w500),
            ), // 任务标题
            SizedBox(height: 10), // 垂直间距
            TextField(
              controller: titleController, // 设置标题控制器，用于获取标题输入框的值
              decoration: InputDecoration(
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(10), // 设置输入框的圆角
                ),
                hintText: 'Enter Task Title',
              ), // 设置输入框的样式
            ), // 标题输入框
            SizedBox(height: 20), // 垂直间距
            Text(
              'Task Description',
              style: TextStyle(fontWeight: FontWeight.w500),
            ), // 任务描述
            SizedBox(height: 10), // 垂直间距
            TextField(
              controller: descriptionController, // 设置描述控制器，用于获取描述输入框的值
              maxLines: 5, // 设置描述输入框的最大行数为 5，即最多可以输入 5 行文本
              decoration: InputDecoration(
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(10), // 设置输入框的圆角
                ),
                hintText: 'Enter Task Description,Max 5 Lines', // 设置输入框的提示文本
              ), // 设置输入框的样式
            ),
            SizedBox(height: 20), // 垂直间距
            Text(
              'Due Date', // 截止日期
              style: TextStyle(fontWeight: FontWeight.w500), // 设置文本的字体为粗体
            ), // 截止日期
            SizedBox(height: 10), // 垂直间距
            TextButton.icon(
              onPressed: () async {
                selectedDate = await showDatePicker(
                  context: context, // 设置上下文，用于获取当前的应用程序上下文
                  initialDate: selectedDate,
                  firstDate: DateTime(2000), // 设置最早的日期为 2000 年 1 月 1 日
                  lastDate: DateTime(2100), // 设置最晚的日期为 2100 年 12 月 31 日
                );
                setState(() {});
              },
              label: Text(
                selectedDate == null
                    ? "Pick a Due Date"
                    : "${selectedDate!.toLocal()}".split(
                      ' ',
                    )[0], // 如果选中的日期为 null，则显示 'Pick a Due Date'，否则显示选中的日期，split('')[0] 表示分割字符串，取第一个元素，即日期
                // 设置图标为日历图标
              ),
              icon: Icon(
                Icons.calendar_month_rounded,
                color: Colors.deepPurple,
              ),
            ), // 日期选择器
            SizedBox(height: 30), // 垂直间距
            Center(
              child: ElevatedButton(
                style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.deepPurple, // 设置按钮的背景颜色为深紫色
                  foregroundColor: Colors.white, // 设置按钮的前景颜色为白色，即按钮上的文本颜色
                  minimumSize: Size(200, 50), // 设置按钮的最小尺寸为 200 像素宽，50 像素高
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(30), // 设置按钮的圆角为 10 像素
                  ),
                ),
                onPressed: () {
                  if (titleController.text.isEmpty ||
                      descriptionController.text.isEmpty ||
                      selectedDate == null) {
                    // 如果标题或描述为空，则显示提示信息
                    Get.snackbar(
                      'Error', // 提示信息的标题
                      'Please fill all the fields', // 提示信息的内容
                      backgroundColor: Colors.red, // 提示信息的背景颜色为红色
                      colorText: Colors.white, // 提示信息的文本颜色为白色
                      snackStyle: SnackStyle.GROUNDED, // 提示信息的样式为圆角
                      icon: Icon(
                        Icons.error, // 提示信息的图标为错误图标
                        color: Colors.white, // 提示信息的图标颜色为白色
                      ),
                      duration: Duration(seconds: 3), // 提示信息的显示时间为 3 秒
                    );
                    return; // 退出方法，不执行保存任务的操作
                  }
                  if (widget.task != null) {
                    // 如果是编辑任务，则更新任务
                    taskController.updateTask(
                      widget.index!, // 获取任务的索引
                      Task(
                        title: titleController.text, // 获取标题输入框的值
                        description: descriptionController.text, // 获取描述输入框的值
                        isCompleted:
                            widget.task!.isCompleted, // 设置任务的完成状态为原来的状态
                        dueDate: selectedDate!, // 设置任务的截止日期为选中的日期
                        countDown: widget.task!.countDown, // 设置任务的倒计时为原来的倒计时
                      ),
                    );
                    Get.back(); // 返回上一个页面
                    Get.snackbar(
                      'Success',
                      'Task edited successfully',
                      backgroundColor: Colors.green,
                      colorText: Colors.white,
                    );
                  } else {
                    // 如果是添加任务，则添加任务
                    taskController.addTask(
                      Task(
                        title: titleController.text, // 获取标题输入框的值
                        description: descriptionController.text, // 获取描述输入框的值
                        isCompleted: false, // 设置任务的完成状态为 false，即未完成
                        dueDate: selectedDate!, // 设置任务的截止日期为选中的日期
                        countDown:
                            selectedDate!
                                .difference(DateTime.now())
                                .inDays, // 设置任务的倒计时为 0，即没有倒计时
                      ),
                    );
                    Get.back(); // 返回上一个页面
                    Get.snackbar(
                      'Success',
                      'Task saved successfully',
                      backgroundColor: Colors.green,
                      colorText: Colors.white,
                    ); // 显示提示信息，任务保存成功
                  }
                },
                child: Text(widget.task == null ? 'Save Task' : 'Update Task'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
